package com.spider.admin.utils;

import org.apache.commons.lang3.StringUtils;

import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.Path;

public class FileUtils {

    /**
     * 文件夹的复制
     *
     * @param srcFile  源文件夹File对象
     * @param destFile 目标文件夹File对象
     * @throws IOException IOException
     */
    public static void copyFolder(File srcFile, File destFile,String newFolderName) throws IOException {
        //判断数据源File是否是文件
        if (srcFile.isDirectory()) {
            String srcFileName = newFolderName;
            if(StringUtils.isEmpty(newFolderName)) {
                //在目的地下创建和数据源File名称一样的目录
                srcFileName = srcFile.getName();
            }
            File newFolder = new File(destFile, srcFileName);
            if (!newFolder.exists()) {
                newFolder.mkdir();
            }
            //获取数据源File下所有文件或者目录的File数组
            File[] listFiles = srcFile.listFiles();

            //遍历该File数组，得到每一个File对象
            for (File file : listFiles) {
                //把该File作为数据源File对象，递归调用复制文件夹的方法
                copyFolder(file, newFolder,null);
            }
        } else {
            //说明是文件，直接用字节流复制
            File newFile = new File(destFile, srcFile.getName());
            copyFile(srcFile, newFile);
        }

    }

    /**
     * 复制文件
     *
     * @param srcFile  源文件
     * @param destFile 目标文件
     * @throws IOException IOException
     */
    public static void copyFile(File srcFile, File destFile) throws IOException {
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
            if (!destFile.getParentFile().exists()) {
                destFile.getParentFile().mkdirs();
            }

            if (!destFile.exists()) {
                destFile.createNewFile();
            }

            bis = new BufferedInputStream(new FileInputStream(srcFile));
            bos = new BufferedOutputStream(new FileOutputStream(destFile));

            int len;
            byte[] bys = new byte[1024];
            while ((len = bis.read(bys)) != -1) {
                bos.write(bys, 0, len);
            }
        } finally {

            if (null != bos) {
                try {
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != bis) {
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void deleteDirectoryRecursively(String directoryPath) {
        try {
            Path dir = Paths.get(directoryPath);

            // 递归删除文件夹及其所有内容
            Files.walk(dir)
                    .sorted((p1, p2) -> p2.compareTo(p1)) // 从底层开始删除
                    .forEach(p -> {
                        try {
                            Files.delete(p);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void writeFile(String filePath, String content) throws IOException {
        File file=new File(filePath);
        if (!file.getParentFile().exists()) {
            file.getParentFile().mkdirs();
        }

        if(!file.exists()){
            file.createNewFile();
        }
        Files.write(Paths.get(filePath), content.getBytes());
    }
}
